#include "app_message.h"
#include <string.h>
#include "cJSON.h"
#include <stdlib.h>
#include "app_common.h"
#include "log.h"

/**
 *  @brief  把字节数组转换成json字符串 
 * @param  data   字节数组
 * @param  len  字节数组长度
 * @return  json字符串
 * 步骤 ：
 * 1  从字节数组中把对应的3个值提取出来 1 conn_type 2 id 3 msg
 * 2  要把id 和msg 从字节数组转换为16进的字符串
 * 3  拼接为json
 */
char *app_message_bytes_to_json(  char *data, int len)
{ 
    //1  从字节数组中把对应的3个值提取出来 1 conn_type 2 id 3 msg
    int conn_type = data[0]; //连接类型   1
    int id_len= data[1];//id的长度
    int msg_len = data[2];//msg的长度
    char id_btyes[id_len];//id的字节数组   2
    memcpy(id_btyes,data+3,id_len);
    char msg_btyes[msg_len]; //msg的字节数组  3
    memcpy(msg_btyes,data+3+id_len,msg_len);

    //2  要把id 和msg 从字节数组转换为16进的字符串
    char *id_hexstr=app_common_bytes_to_hexstr(id_btyes,id_len); //2
    char *msg_hexstr=app_common_bytes_to_hexstr(msg_btyes,msg_len); //3 
    //3  拼接为json  1 create  2  add  3 print
    cJSON *root= cJSON_CreateObject();
    cJSON_AddNumberToObject(root,"conn_type",conn_type);
    cJSON_AddStringToObject(root,"id",id_hexstr);
    cJSON_AddStringToObject(root,"msg",msg_hexstr);
    char *json_str=cJSON_PrintUnformatted(root);

    //4 释放内存
    cJSON_Delete(root);
    free(id_hexstr);
    free( msg_hexstr);

    return  json_str;

}

/**
 *  @brief  把json字符串转换成字节数组
 * @param  json   json字符串
 * @param  buffer   字节数组容器
 * @param  buffer_len  字节容器的长度
 * @return  转换的字节数
 * 
 * 步骤：
 * 1 从json中把对应的3个值提取出来 1 conn_type 2 id 3 msg
 * 2  把id 和msg 从16进制的字符串转换为字节数组
 * 3  把3个值拼接为字节数组
 */
 int app_message_json_to_bytes(char *json, char *buffer, int buffer_len)
 {
   // * 1 从json中把对应的3个值提取出来 1 conn_type 2 id 3 msg
    //     1 parse 2 get 3  ->valueint
    cJSON *root=cJSON_Parse(json);
    cJSON *conn_type_cJSON = cJSON_GetObjectItem(root,"conn_type") ;
    cJSON *id_cJSON = cJSON_GetObjectItem(root,"id") ;
    cJSON *msg_cJSON= cJSON_GetObjectItem(root,"msg") ;
    int conn_type = conn_type_cJSON->valueint; //1
    char *id_hexstr = id_cJSON->valuestring;
    char *msg_hexstr = msg_cJSON->valuestring;


   // * 2  把id 和msg 从16进制的字符串转换为字节数组
    int id_len = strlen(id_hexstr)/2; //2
    char  id[id_len]; //4
    id_len=app_common_hexstr_to_bytes(id_hexstr,id,id_len);
    
    int msg_len = strlen(msg_hexstr)/2; //3
    char  msg[msg_len]; //5
    msg_len=app_common_hexstr_to_bytes(msg_hexstr,msg,msg_len);



   // * 3  把3个值拼接为字节数组
   int bytes_len = 3+id_len+msg_len;
   if(bytes_len>buffer_len)
   {
     log_error("buffer_len is too small");
     return -1;
   }
   buffer[0] = conn_type;
   buffer[1] = id_len;
   buffer[2] = msg_len;
   memcpy(buffer+3,id,id_len);
   memcpy(buffer+3+id_len,msg,msg_len);

   return bytes_len;

 }


